#include <dirent.h>
#include <iostream>
#include <locale.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>


#include "shelter.h"
using namespace std;
using namespace cv;
/********************************************************************************************
 *函数描述： shelterException 计算并返回一幅图像是否存在遮挡
 *函数参数： Mat img 需要计算的图片，BGR存放格式，彩色（3通道），灰度图无效
 * result 为img图像转成灰度图，再转成二值化图像
 * findContours 返回的是所有轮廓的二维坐标的点集合。
 * contourArea
 *计算的是所有轮廓的面积，求出最大的面积。如果遮挡的面积超过1/5则判断为遮挡。
 *函数返回值： 返回值通过判定th阈值大小，返回是否有遮挡，无显式返回值
 *********************************************************************************************/
bool shelterException(Mat img) {
  Mat result;
  double area = img.rows * img.cols;
  // imshow("Source Image",img);//显示原图像
  //进行二值化处理，选择30，200.0为阈值
  // threshold(img, result, 30, 200.0, CV_THRESH_BINARY);
  cvtColor(img, result, CV_BGR2GRAY);
  blur(result, result, Size(3, 3));
  threshold(result, result, 30, 200, 1);
  // imshow("二值化图像", result);
  vector<vector<Point>> contours; //用于存储二位点集
  vector<Vec4i> hierarchy;
  findContours(result, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE,
               Point()); //找出图片中所有的轮廓，并将二维轮廓点集保存到
  // contours中，contours[i]代表的是第i个轮廓，contours[i].size()代表的是第i个轮廓上所有的像素点数
  Mat imageContours = Mat::zeros(img.size(), CV_8UC1);
  Mat Contours = Mat::zeros(img.size(), CV_8UC1); //绘制
  double maxarea = 0;
  for (int i = 0; i < contours.size(); i++) {
    double tmparea = contourArea(
        contours
            [i]); //根据轮廓计算面积，注意位置的不同，可能面积会为负值，所以使用绝对值，求面积
    if (tmparea > maxarea) {
      maxarea = tmparea;
    }
  }
  double th = maxarea / area;
  if (th >= 0.20) {
    printf("图像遮挡！！！遮挡率为: %f\n", th);
    return true;
  }
  // else{
  // 	printf("图像正常，未被遮挡！: %f\n",th);
  // }
  return false;
}